<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // function add(x) {
    //     return function (z) {
    //       return x + z
    //     }
    // }
    // add(1)(2);



    //  柯里化函数 称为部分求值 含义为给函数分布传递参数
    // sumFn 当作实参传入到柯里化函数当中， func 当作形参接收  
    const sumFn = (...args) => {
      return args.reduce((a, b) => {
        return a + b
      })
    }
    const currying = function (func) {
      // args 空数组作为func的参数 也就是最终sumFn内的参数
      const args = []
      // 每次传递函数进行处理  并返回一个新的函数接受剩余的参数  也就是result
      return function result(...rest) {
        if (rest.length === 0) {
          return func(...args)
        }
        else {
          args.push(...rest)
          return result
        }
      }
    }
  console.log(currying(sumFn)(1)(2)(3)());



  // const curry = (fn) => {
  //           let judge = (...args) => {
  //               if (args.length === fn.length) return fn(...args)
  //               return (...arg) => judge(...args, ...arg)
  //           }
  //           return judge
  //       }
  </script>
</body>

</html>